package br.udesc.lpg2.graphics;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;

import br.udesc.lpg2.Carta;
import br.udesc.lpg2.ControleJogo;

public class Painel implements ActionListener {
	
	private static Painel painel;
	private JFrame frameMesa;
    private JPanel painelMesa;
    private CartaPainel cartaEsquerda, cartaDireita;
    private JButton botaoRodada;
    private TitledBorder nomeJogadorEsquerda, nomeJogadorDireita;
    private JLabel mensagem;
    private ControleJogo controleJogo;
    
    public static Painel getInstance() {
    	if(painel == null) {
    		painel = new Painel();
    	}
    	return painel;
    }

    private Painel() {
    	this.criaPainelMesa();
    	this.criaFrame();
    	this.adicionaComponentes();
        frameMesa.setVisible(true);
    }
    
    private void criaFrame() {
    	JFrame.setDefaultLookAndFeelDecorated(true);
    	frameMesa = new JFrame("Cartas");
        frameMesa.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frameMesa.add(painelMesa);        
        frameMesa.setSize(450, 350);
    }
    
    private void criaPainelMesa() {
    	painelMesa = new JPanel(new GridLayout(2, 2));
        painelMesa = new JPanel();
        painelMesa.setLayout(new BoxLayout(painelMesa, BoxLayout.PAGE_AXIS));
    }
    
    private JButton criaBotaoRodada() {
    	botaoRodada = new JButton("Rodada");
    	botaoRodada.addActionListener(this);
    	botaoRodada.setHorizontalAlignment(SwingConstants.LEFT);
    	frameMesa.getRootPane().setDefaultButton(botaoRodada);
    	return botaoRodada;
    }
    
    private void criaCartaEsquerda() {
    	cartaEsquerda = new CartaPainel("Sem carta", 0, 0);
        cartaEsquerda.setVerticalAlignment(SwingConstants.CENTER);
        cartaEsquerda.setHorizontalAlignment(SwingConstants.CENTER);
    }
    
    private void criaCartaDireita() {
    	cartaDireita = new CartaPainel("Sem carta", 0, 0);
        cartaDireita.setVerticalAlignment(SwingConstants.CENTER);
        cartaDireita.setHorizontalAlignment(SwingConstants.CENTER);
    }
    
    private void criaNomeJogadorEsquerda() {
    	nomeJogadorEsquerda = BorderFactory.createTitledBorder("Jogador 1");
    }
    
    private void criaNomeJogadorDireita() {
    	nomeJogadorDireita = BorderFactory.createTitledBorder("Jogador 2");
    }
    
    private JPanel criaPainelEsquerdo() {
    	this.criaCartaEsquerda();
    	this.criaNomeJogadorEsquerda();
    	return this.criaPainel(nomeJogadorEsquerda, cartaEsquerda);
    }
    
    private JPanel criaPainelDireito() {
    	this.criaCartaDireita();
    	this.criaNomeJogadorDireita();
    	return this.criaPainel(nomeJogadorDireita, cartaDireita);
    }
    
    private JPanel criaPainel(TitledBorder titulo, CartaPainel carta) {
    	JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
        panel.setBorder(BorderFactory.createCompoundBorder(
                titulo,
                BorderFactory.createEmptyBorder(10,10,10,10)));
        panel.add(carta);
        return panel;
    }
    
    private JPanel criaPainelCartas() {
    	JPanel painelCartas = new JPanel();
    	painelCartas.setLayout(new BoxLayout(painelCartas, BoxLayout.LINE_AXIS));
    	painelCartas.add(this.criaPainelEsquerdo());
    	painelCartas.add(Box.createRigidArea(new Dimension(10,0)));
    	painelCartas.add(this.criaPainelDireito());
    	return painelCartas;
    }
    
    private JPanel criaPainelMensagem() {
    	this.mensagem = new JLabel();    	
    	JPanel painelMensagem = new JPanel();
    	painelMensagem.setLayout(new BoxLayout(painelMensagem, BoxLayout.LINE_AXIS));
    	painelMensagem.add(mensagem);
    	return painelMensagem;
    }
    
    private void adicionaComponentes() {
    	painelMesa.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
        painelMesa.add(this.criaBotaoRodada());
        painelMesa.add(Box.createRigidArea(new Dimension(0,10)));
        painelMesa.add(this.criaPainelCartas());
        painelMesa.add(Box.createRigidArea(new Dimension(0,10)));
        painelMesa.add(this.criaPainelMensagem());
        
    }
    
    public void actionPerformed(ActionEvent event) {
        new PainelWorker().execute();
    }
    
    public void setControleJogo(ControleJogo controleJogo) {
    	this.controleJogo = controleJogo;
    }

    public void setMensagem(String mensagem) {
		this.mensagem.setText(mensagem);
	}

	public void setNomeJogadorEsquerda(String nomeJogador1) {
		this.nomeJogadorEsquerda.setTitle(nomeJogador1);
	}
	
	public void setNomeJogadorDireita(String nomeJogador2) {
		this.nomeJogadorDireita.setTitle(nomeJogador2);
	}
	
	public void atualizaCartaEsquerda(Carta carta) {
		this.cartaEsquerda.atualiza(carta);
	}
	
	public void atualizaCartaDireita(Carta carta) {
		this.cartaDireita.atualiza(carta);
	}
	
	public void setStatusCartaEsquerda(String status) {
		this.cartaEsquerda.setStatus(status);
	}
	
	public void setStatusCartaDireita(String status) {
		this.cartaDireita.setStatus(status);
	}
	
	private class PainelWorker extends SwingWorker<Void, Void> {
		protected Void doInBackground() {
			if(controleJogo.temMaisRodadas())
	        	controleJogo.executaRodada();
			return null;
		}
	}
	
}